// 指针

#include <stdio.h>

void f(int* p);

int main(int argc, char const *argv[])
{
    int i = 10;
    // 表示 p 指向一个 int 类型的变量
    int* p = &i;
    printf("sizeof(p) = %d\n", sizeof(p));
    // * 的位置可以靠近指针也可以靠近变量，但意思是相同的
    // 都表示 p 是一个指针，而 q 是一个普通的int变量);
    // int* p, q;
    // int *p, q;
    // 想定义两个指针，则要在 q 前也加上 *
    // int* q, * q;

    // 作为参数的指针
    printf("ori i = %d\n", i);
    f(&i);
    printf("now i = %d\n", i);

    return 0;
}

void f(int* p)
{
    printf("p = %p\n", p);
    // * 运算符：单目运算符
    // 用来访问指针的值所表示的地址上的变量
    // 可以做左值也可以做右值
    // * 左值之所以叫做左值，是因为等号左边不是变量，而是值，是表达式计算的结果
    int k = *p;
    *p = k + 1;
    printf("*p = %d\n", *p);
    // *&yptr *(&yptr) *(yptr的地址) --> 得到该地址上的变量：yptr
    // &*yptr &(*yptr) &(y) --> 得到 y 的地址，也就是yptr
}